home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Examples / DriverKit / Adaptec1542B / Adaptec1542B_reloc.tproj / AHAInline.h < prev    next >
Encoding:
Text File  |  1995-02-10  |  2.2 KB  |  158 lines

  1. /*
  2.  * Copyright (c) 1992 NeXT Computer, Inc.
  3.  *
  4.  * Adaptec AHA-1542 SCSI controller inline functions.
  5.  *
  6.  * HISTORY
  7.  *
  8.  * 12 July 1992 David E. Bohman at NeXT
  9.  *    Created.
  10.  */
  11.  
  12. #import <driverkit/i386/ioPorts.h>
  13.  
  14. /*
  15.  * Primitives to access the
  16.  * board registers.
  17.  */
  18.  
  19. static inline
  20. void
  21. aha_put_ctrl(
  22.     unsigned short    base,
  23.     aha_ctrl_reg_t    reg
  24. )
  25. {
  26.     union {
  27.     aha_ctrl_reg_t        reg;
  28.     unsigned char        data;
  29.     } tconv;
  30.     
  31.     tconv.reg = reg;
  32.  
  33.     outb(base + AHA_CTRL_REG_OFF, tconv.data);
  34. }
  35.  
  36. static inline
  37. aha_stat_reg_t
  38. aha_get_stat(
  39.     unsigned short    base
  40. )
  41. {
  42.     union {
  43.     aha_stat_reg_t        reg;
  44.     unsigned char        data;
  45.     } tconv;
  46.  
  47.     tconv.data = inb(base + AHA_STAT_REG_OFF);
  48.  
  49.     return (tconv.reg);
  50. }
  51.  
  52. static inline
  53. aha_intr_reg_t
  54. aha_get_intr(
  55.     unsigned short    base
  56. )
  57. {
  58.     union {
  59.     aha_intr_reg_t        reg;
  60.     unsigned char        data;
  61.     } tconv;
  62.  
  63.     tconv.data = inb(base + AHA_INTR_REG_OFF);
  64.  
  65.     return (tconv.reg);
  66. }
  67.  
  68. static inline
  69. void
  70. aha_put_cmd(
  71.     unsigned short    base,
  72.     aha_cmd_reg_t    reg
  73. )
  74. {
  75.     outb(base + AHA_CMD_REG_OFF, reg);
  76. }
  77.  
  78. static inline
  79. aha_cmd_reg_t
  80. aha_get_cmd(
  81.     unsigned short    base
  82. )
  83. {
  84.     return (inb(base + AHA_CMD_REG_OFF));
  85. }
  86.  
  87. /*
  88.  * Functions built on top
  89.  * of the primatives above.
  90.  */
  91.  
  92. static inline
  93. void
  94. aha_clr_intr(
  95.     unsigned short    base
  96. )
  97. {
  98.     aha_ctrl_reg_t    ctrl = { 0 };
  99.  
  100.     ctrl.intr_clr = 1;
  101.  
  102.     aha_put_ctrl(base, ctrl);
  103. }
  104.  
  105.  
  106. static inline
  107. boolean_t
  108. aha_await_datain(
  109.     IOEISAPortAddress    base,
  110.     unsigned int    how_long
  111. )
  112. {
  113.     aha_stat_reg_t    stat;
  114.  
  115.     do {
  116.         stat = aha_get_stat(base);
  117.     } while (!stat.datain_full && how_long--);
  118.     return how_long;
  119. }
  120.  
  121.  
  122. static inline
  123. boolean_t
  124. aha_get_bytes(
  125.     IOEISAPortAddress    base,
  126.     unsigned char    *addr,
  127.     unsigned int    length
  128. )
  129. {
  130.     while (length--) {
  131.         if (!aha_await_datain(base, 1000))
  132.         return FALSE;
  133.         *addr++ = inb(base);
  134.     }
  135.     return TRUE;
  136. }
  137.  
  138.  
  139. /*
  140.  *  24-bit accessor functions (with byte swapping)
  141.  */
  142. static inline void
  143. aha_put_24(unsigned int source, volatile unsigned char *dest)
  144. {
  145.     dest[2] = source & 0xff;
  146.     dest[1] = (source >> 8) & 0xff;
  147.     dest[0] = (source >> 16) & 0xff;
  148. }
  149.  
  150.  
  151. static inline unsigned int
  152. aha_get_24(volatile unsigned char *source)
  153. {
  154.     return (source[0] << 16) | (source[1] << 8) | source[2];
  155. }
  156.  
  157.  
  158.